home *** CD-ROM | disk | FTP | other *** search
/ The Original Shareware 1.1 / The Original Shareware (WeMake CDs)(Volume 1.1)(CDs, Inc)(1993).iso / 38 / giftif.zip / GIFREADE.C < prev    next >
C/C++ Source or Header  |  1989-11-22  |  3KB  |  153 lines

  1. /*----------------------------------------------------------------------*/
  2. /* Copyright (c) 1987                            */
  3. /* by CompuServe Inc., Columbus, Ohio.  All Rights Reserved        */
  4. /* GIFREADE.C can be copied and distributed freely for any        */
  5. /* non-commercial purposes. GIFREADE.C can only be incorporated        */
  6. /* into commercial software with the permission of CompuServe Inc.    */
  7. /*----------------------------------------------------------------------*/
  8.  
  9. #include "GIFbase.h"
  10. #include "GIFReader.h"
  11.  
  12. #define TRUE    (-1)
  13. #define FALSE    0
  14.  
  15.  
  16. short ReadScreenDesc(
  17.              short        (*ReadByte)(void),
  18.              short        *Width,
  19.              short        *Height,
  20.              short        *ColorRez,
  21.              short        *FillColor,
  22.              short        *NumColors,
  23.              struct ColorEntry    ColorMap[],
  24.              short        ColorMapSize
  25.             )
  26. /*
  27.  * Read the signature, the screen description, and the optional default
  28.  * color map.
  29.  */
  30.  
  31.     {
  32.     unsigned char Buffer[16];
  33.  
  34.     short
  35.     I, J,
  36.     Status,
  37.     HaveColorMap,
  38.     NumPlanes;
  39.  
  40.     for (I = 0; I < 13; I++)
  41.     {
  42.     Status = (*ReadByte)();
  43.     if (Status < 0) return FALSE;
  44.     Buffer[I] = (unsigned char) Status;
  45.     }
  46.  
  47.     for (I = 0; I < 6; I++)
  48.     if (Buffer[I] != GIFsignature[I])
  49.         return FALSE;
  50.  
  51.     *Width = Buffer[6] | Buffer[7] << 8;
  52.     *Height = Buffer[8] | Buffer[9] << 9;
  53.     NumPlanes = (Buffer[10] & 0x0F) + 1;
  54.  
  55.     /* bit 3 should be 0 in rev 87a */
  56.  
  57.     *ColorRez = ((Buffer[10] & 0x70) >> 4) + 1;
  58.     HaveColorMap = (Buffer[10] & 0x80) != 0;
  59.     *NumColors = 1 << NumPlanes;
  60.     *FillColor = Buffer[11];
  61. /*  Reserved = Buffer[12]; */
  62.  
  63.     if (HaveColorMap)
  64.     {
  65.     for (I = 0; I < *NumColors; I++)
  66.         {
  67.         for (J = 0; J < 3; J++)
  68.         {
  69.         Status = (*ReadByte)();
  70.         if (Status < 0) return FALSE;
  71.         Buffer[J] = (unsigned char) Status;
  72.         }
  73.  
  74.         if (I < ColorMapSize)
  75.         {
  76.         ColorMap[I].red = Buffer[0];
  77.         ColorMap[I].green = Buffer[1];
  78.         ColorMap[I].blue = Buffer[2];
  79.         }
  80.         }
  81.     }
  82.     else
  83.     *NumColors = 0;
  84.  
  85.     return TRUE;
  86.     }
  87.  
  88. /*$page*/
  89.  
  90. short ReadImageDesc(
  91.             short (*ReadByte)(void),
  92.             short *LeftEdge,
  93.             short *TopEdge,
  94.             short *Width,
  95.             short *Height,
  96.             short *Interlaced,
  97.             short *NumColors,
  98.             struct ColorEntry ColorMap[],
  99.                 short ColorMapSize )
  100. /*
  101.  * Read the image description and the optional color map.
  102.  */
  103.     {
  104.     unsigned char Buffer[16];
  105.  
  106.     short
  107.     I, J,
  108.     NumPlanes,
  109.     HaveColorMap,
  110.     Status;
  111.  
  112.     for (I = 0; I < 9; I++)
  113.     {
  114.     if ((Status = (*ReadByte)()) < 0) return FALSE;
  115.     Buffer[I] = (unsigned char) Status;
  116.     }
  117.  
  118.     *LeftEdge = Buffer[0] | Buffer[1] << 8;
  119.     *TopEdge = Buffer[2] | Buffer[3] << 8;
  120.     *Width = Buffer[4] | Buffer[5] << 8;
  121.     *Height = Buffer[6] | Buffer[7] << 8;
  122.     NumPlanes = (Buffer[8] & 0x0F) + 1;
  123.     *NumColors = 1 << NumPlanes;
  124.  
  125.     /* Bits 3, 4, and 5 should be zero (reserved) in rev 87a */
  126.  
  127.     *Interlaced = (Buffer[8] & 0x40) != 0;
  128.     HaveColorMap = (Buffer[8] & 0x80) != 0;
  129.  
  130.     if (HaveColorMap)
  131.     {
  132.     for (I = 0; I < *NumColors; I++)
  133.         {
  134.         for (J = 0; J < 3; J++)
  135.         {
  136.         if ((Status = (*ReadByte)()) < 0) return FALSE;
  137.         Buffer[J] = (unsigned char) Status;
  138.         }
  139.  
  140.         if (I < ColorMapSize)
  141.         {
  142.         ColorMap[I].red = Buffer[0];
  143.         ColorMap[I].green = Buffer[1];
  144.         ColorMap[I].blue = Buffer[2];
  145.         }
  146.         }
  147.     }
  148.     else
  149.     *NumColors = 0;
  150.  
  151.     return TRUE;
  152.     }
  153.